#include "myhead.h"

/*
	udp组播发送
*/

int main()
{
	int udpsock;
	int ret;
	char buf[100];
	struct sockaddr_in bindaddr;
	bzero(&bindaddr,sizeof(bindaddr));
	bindaddr.sin_family=AF_INET;
	bindaddr.sin_addr.s_addr=htonl(INADDR_ANY); //必须使用这个宏定义，否则无法收到组播、广播信息
	bindaddr.sin_port=htons(10000);
	
	struct sockaddr_in otheraddr;
	bzero(&otheraddr,sizeof(otheraddr));
	otheraddr.sin_family=AF_INET;
	inet_aton("225.10.10.10",&(otheraddr.sin_addr)); //必须写组播地址   D类地址
	otheraddr.sin_port=htons(20000);
	//创建udp套接字
	udpsock=socket(AF_INET,SOCK_DGRAM,0);
	if(udpsock==-1)
	{
		perror("创建udp");
		return -1;
	}
	
	//取消端口绑定的限制
	int on=1;
	setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
	
	//绑定
	ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
	if(ret==-1)
	{
		perror("bind");
		return -1;
	}
	
	//设置套接字可以广播，组播是广播的一种特殊形式
	setsockopt(udpsock,SOL_SOCKET, SO_BROADCAST ,&on,sizeof(on));  
	
	//组播发送信息出去
	while(1)
	{
		bzero(buf,100);
		printf("请输入要发送的组播信息!\n");
		scanf("%s",buf);
		ret=sendto(udpsock,buf,strlen(buf),0,(struct sockaddr *)&otheraddr,sizeof(otheraddr));
		printf("sendto 返回值是:%d\n",ret);
	}
	
	//关闭
	close(udpsock);
	return 0;
}